﻿using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using System.Windows.Ink;
using System.Threading;
using RozpoznawanieCore.KsztaltyFolder;

namespace RozpoznawanieCore
{
    public enum TypKsztaltu { CLASS, KRESKA, PROSTY_POZIOM, PROSTY_PION, PROSTY_SKOS };
    public class Rozpoznawanie
    {
        private Semaphore semKontrolek = new Semaphore(0, 1);
        private Semaphore semCzyszczenia = new Semaphore(0, 1);
        private Semaphore semWPF1 = new Semaphore(1, 1);
        private Semaphore semWPF2 = new Semaphore(1, 1);
        private String kontrolka = null;
        private StrokeCollection strolki = new StrokeCollection();
        private long ostatniaAktualizacja = 0;
        private bool rysujeTeraz = false;
        private WynikRozpoznawania wynik = new WynikRozpoznawania();
        private Ksztalty listaKsztaltow = new Ksztalty();
        private bool zakonczTeraz = false;
        InkAnalyzer theInkAnalyzer;
        private StrokeCollection wszystkieStroki = new StrokeCollection();
        private int czasRysowania;
        public bool RysujeTeraz
        {
            get
            {
                return this.rysujeTeraz;
            }
            set
            {
                this.rysujeTeraz = value;
                DateTime current = DateTime.Now;
                if (this.rysujeTeraz)
                {

                    czasRysowania = current.Millisecond + current.Second * 1000;
                }
                else
                {
                    czasRysowania = current.Millisecond + current.Second * 1000 - czasRysowania;
                }
            }
        }
        public WynikRozpoznawania rozpoznawaj()
        {

           // System.Console.WriteLine("sram");
            // ConsoleKeyInfo a = Console.ReadKey();


            while (strolki.Count == 0)
            {
                try
                {
                    //Console.WriteLine("czekam bo strolkow zero jest");
                    Thread.Sleep(100);
                }
                catch (Exception ex)
                {
                    String e  = ex.ToString();
                    Console.Out.WriteLine(e);
                }
            }
            while (true)
            {

                DateTime current = DateTime.Now;
               // Console.WriteLine(rysujeTeraz + " " + (current.Millisecond + current.Second * 1000 > ostatniaAktualizacja + 2000)+ " ostatnia "+ostatniaAktualizacja+ " curMili "+current.Millisecond+ " sec "+current.Second);
                long czasTeraz = current.Millisecond + current.Second * 1000 + current.Minute * 1000 * 60 + current.Hour * 1000 * 60 * 60 + current.Day * 1000 * 60 * 60 * 24;
                zakonczTeraz = wynik.konczT;
                if (zakonczTeraz || (rysujeTeraz == false && czasTeraz > ostatniaAktualizacja + 900))
                {
                    wynik.strokeCollection = strolki;
                     for (int i = 0; i < wszystkieStroki.Count; i++)
                    {
                        
                        if (!wynik.strokeCollection.Contains(wszystkieStroki[i]))
                        {
                            wynik.zleStroki.Add(wszystkieStroki[i]);
                        }
                    }
                    Console.WriteLine("Wyszlo mi ze " + wynik.nazwa+" "+wynik.zleStroki.Count);
                    return wynik;
                }
                else
                {
                    Thread.Sleep(50);
                }

            }
        }

        private void nowyStrokePrzyszedl()
        {
            DateTime current = DateTime.Now;
            ostatniaAktualizacja = current.Millisecond + current.Second * 1000 +current.Minute*1000*60+ current.Hour*1000*60*60+current.Day*1000*60*60*24;
        }
        public static void Main(string[] args)
        {
            
            ConsoleKeyInfo a = Console.ReadKey();
        }

        public void dodajStrolka(Stroke stroke1)
        {
            if(wszystkieStroki.Contains(stroke1)) return;             
            wszystkieStroki.Add(stroke1);
            System.Console.WriteLine("dodale stroka "+wszystkieStroki.Count);
            nowyStrokePrzyszedl();
            StrokeCollection col = new StrokeCollection();
            col.Add(stroke1);
            strolki = col;
            theInkAnalyzer = new InkAnalyzer();
            theInkAnalyzer.AddStrokes(col);
            // theInkAnalyzer.SetStrokesType(stroke, StrokeType.Writing);

            

            //  theInkAnalyzer.

            AnalysisStatus status = theInkAnalyzer.Analyze();
            Console.WriteLine("wstępne rozpoznanie " + status.Successful );
            Console.WriteLine("wynik " + wynik);
          
            
            if (status.Successful == false || theInkAnalyzer.GetRecognizedString().CompareTo("Other")==0 && wynik.nazwa==null)
            {
                theInkAnalyzer = new InkAnalyzer();
                Console.WriteLine("ilosć strołków " + wszystkieStroki.Count);
                theInkAnalyzer.AddStrokes(wszystkieStroki);
                status = theInkAnalyzer.Analyze();
                Console.WriteLine("drugie rozpoznanie " + status.Successful);
                Console.WriteLine("rozpoznano2 " + theInkAnalyzer.GetRecognizedString());
                if (status.Successful && theInkAnalyzer.GetRecognizedString().Contains("Other") == false) { Console.WriteLine("jest wpisane "); col = wszystkieStroki; }
            }

            String rozpoznano;
            if (!status.Successful)
            {
                rozpoznano = "Other";
               
            }
            else
                rozpoznano = theInkAnalyzer.GetRecognizedString();


            Console.WriteLine("rozpoznano " + rozpoznano+" col wielkosc "+col.Count);
            Ksztalt k = Ksztalt.dajKsztalt(col, rozpoznano, czasRysowania);
            Console.WriteLine("k wyszlo " + k);
            if (k != null)
            {
                Console.WriteLine("ksztalt wyszedl" + k);
                if (k is Kreska) Console.WriteLine(((Kreska)k).orientacja);

                WynikRozpoznawania w = listaKsztaltow.dodaj(k);
                if (w != null)
                {
                    wynik = w;
                   
                }

            }


            //zakonczTeraz = true;


        }
        public void dodajGestKwadratMocno(StrokeCollection e)
        {
            nowyStrokePrzyszedl();


        }

        public void dodajGestDolMocno(StrokeCollection e)
        {
            nowyStrokePrzyszedl();

        }

        public void dodajGestKolkoMocno(StrokeCollection e)
        {
            nowyStrokePrzyszedl();
        }

        public String wezKontrolkeDoWstawienia()
        {
            semKontrolek.WaitOne();
            lock (kontrolka)
            {
                semWPF2.Release();
                return kontrolka;
            }
        }
    }
}
